#!/usr/bin/python3
# _*_ coding: utf-8 _*_
#
# Copyright (C) 2024 - 2024 heihieyouheihei, Inc. All Rights Reserved 
#
# @Time    : 2024/8/23 23:05
# @Author  : Yuyun
# @File    : leetcode_225_用队列实现栈.py
# @IDE     : PyCharm


"""
请你仅使用两个队列实现一个后入先出（LIFO）的栈，并支持普通栈的全部四种操作（push、top、pop 和 empty）。

实现 MyStack 类：
void push(int x) 将元素 x 压入栈顶。
int pop() 移除并返回栈顶元素。
int top() 返回栈顶元素。
boolean empty() 如果栈是空的，返回 true ；否则，返回 false 。

注意：
你只能使用队列的标准操作 —— 也就是 push to back、peek/pop from front、size 和 is empty 这些操作。
你所使用的语言也许不支持队列。 你可以使用 list （列表）或者 deque（双端队列）来模拟一个队列 , 只要是标准的队列操作即可。


示例：
输入：
["MyStack", "push", "push", "top", "pop", "empty"]
[[], [1], [2], [], [], []]
输出：
[null, null, null, 2, 2, false]

解释：
MyStack myStack = new MyStack();
myStack.push(1);
myStack.push(2);
myStack.top(); // 返回 2
myStack.pop(); // 返回 2
myStack.empty(); // 返回 False


提示：
1 <= x <= 9
最多调用100 次 push、pop、top 和 empty
每次调用 pop 和 top 都保证栈不为空


进阶：你能否仅用一个队列来实现栈。
"""

from collections import deque

#   用两个队列实现栈
class MyStack:
    #初始化队列
    def __init__(self):
        self.queue_in = deque()
        self.queue_out = deque()

    #push()
    def push(self, x):
        self.queue_in.append(x)
    #pop()
    def pop(self):
        if self.empty():
            return None
        #将queue_in的前n-1位加入queue_out
        for i in range(len(self.queue_in) - 1):
            self.queue_out.append(self.queue_in.popleft())
        #交换queue_in 与queue_out内容，再将queue_out内容输出
        self.queue_in, self.queue_out = self.queue_out, self.queue_in
        return self.queue_out.popleft()
    #top()
    def top(self):
        if self.empty():
            return None
        for i in range(len(self.queue_in) - 1):
            self.queue_out.append(self.queue_in.popleft())
            # 交换queue_in 与queue_out内容，再将queue_out内容输出
        self.queue_in, self.queue_out = self.queue_out, self.queue_in
        ans = self.queue_out.popleft()
        self.queue_in.append(ans)
        return ans
    #empty()
    def empty(self):
        return len(self.queue_in) == 0


#   一个队列实现栈
class MyStack_I:
    def __init__(self):
        self.queue = deque()

    # push()
    def push(self, x):
        self.queue_in.append(x)

    # pop()
    def pop(self):
        if self.empty():
            return None
        # 将queue的前n-1位加入末尾
        for i in range(len(self.queue) - 1):
            self.queue.append(self.queue.popleft())
        # 输出最第1位
        return self.queue.popleft()

    # top()
    def top(self):
        if self.empty():
            return None
        # 将queue的前n-1位加入末尾
        for i in range(len(self.queue) - 1):
            self.queue.append(self.queue.popleft())
        ans = self.queue.popleft()
        self.queue.append(ans)
        return ans

    # empty()
    def empty(self):
        return not self.queue

